/*
观察者模式（Observer mode）指的是函数自动观察数据对象，一旦对象有变化，函数就会自动执行。
下面代码中，数据对象person是观察目标，函数print是观察者。一旦数据对象发生变化，print就会自动执行。
*/
const person = observable({
	name: '张三',
	age: 20
});

function print() {
	console.log(`${person.name}, ${person.age}`)
}

observe(print);
person.name = '李四';
// 输出
// 李四, 20



/*
下面，使用 Proxy 写一个观察者模式的最简单实现，即实现observable和observe这两个函数。
思路是observable函数返回一个原始对象的 Proxy 代理，拦截赋值操作，触发充当观察者的各个函数。
*/
const queuedObservers = new Set(); //被观察者队列  set集合
const observe = fn => queuedObservers.add(fn); //观察者 函数
const observable = obj => new Proxy(obj, { //当前被观察者  拦截代理
	set //被写到下面了↓  set:set
});

function set(target, key, value, receiver) {
	const result = Reflect.set(target, key, value, receiver);
	queuedObservers.forEach(observer => observer());
	return result;
}

//总体里说 这玩意还是有点抽象的 普及以后可能会更好吧 没有实战经验有点难理解
